/* *
整数反转
 * 给你一个 32 位的有符号整数 x ，返回将 x 中的数字部分反转后的结果。
 * 如果反转后整数超过 32 位的有符号整数的范围 [−231,  231 − 1] ，就返回 0。
 * 输入：x = 120
 * 输出：21
 * */

/* *
 * 核心思路，用/10和%10从后往前依次取最后一位，一个关键点的负数的处理
 * */

#include<iostream>
using namespace std;

// Solution 1
class Solution_1 {
public:
    int reverse(int x) {
        int outcome = 0;
        while(x != 0){
            // 先处理溢出
            // INT_MAX = 2147483647, INT_MIN = -2147483648
            // 对于正数，如果其前9位已经大于214748364，加上反转后的最后一位数字一定会溢出、
            // 对于前9位等于214748364的情况，最后一位是8或9会溢出，但反转得到INT_MAX的数本身不在32位INT范围内，本题可以不考虑
            if(x > 0 && outcome > INT_MAX / 10){
                return 0;
            }
            // 对于负数，如果其前9位已经小于214748364，加上反转后的最后一位数字一定会溢出
            if(x < 0 && outcome < INT_MIN / 10){
                return 0;
            }
            int tmp = x % 10;
            outcome = outcome * 10 + tmp;
            x /= 10;
        }
        return outcome;
    }
};


//Solution 2 大佬解法，时间空间消耗极少
class Solution_2{
public:
    int reverse(int x){
        long num = 0;
        while (x != 0)
        {
            num = num * 10 + x % 10;
            x /= 10;
        }
        
        return num > INT_MAX || num < INT_MIN ? 0 : num;
    }
};

int main(){
    int x = -456;
    Solution_1 s;
    int out;
    out = s.reverse(x);
    cout<<out;
}